// #include<pthread.h>
// #include<iostream>
// #include<functional>
// #include<vector>
// #include<thread>
// #include<mutex>

// using namespace std;

// class ThreadPool
// {
// public:
//     ThreadPool(size_t thread_num)
//     :_thread_num(thread_num)
//     ,_stop(false)
//     {

//     }
//     ~ThreadPool()
//     {
//         stop();
//     }
//     void start()
//     {
//         for(size_t i=0;i<thread_num;i++)
//         {
//             _threads.push_back([this]
//             {
//                 while(true)
//                 {
//                     function<void()>task;
//                     {
//                         unique_lock<mutex> lock(_mutex);
//                         _condtion.wait(lock,[this]{return _stop || !_tasks.empty()};)
//                     }
//                 }
//             }
//             )
//         }
//     }
// private:
//     size_t _thread_num;
//     vector<thread> _threads;
//     queue<function<void()>> _tasks;
//     mutex _mutex;
//     condition_variable _condition;
//     bool _stop;
// };
// #pragma once
// #include<iostream>
// #include<thread>
// #include<vector>
// #include<queue>
// #include<mutex>
// #include<condition_variable>
// #include<functional>
// #include<pthread.h>

// using namespace std;

// void outputThread(int id)
// {
//     cout<<"Thread"<<id<<"is working"<<endl;
// }
// class ThreadPool
// {
// public:
//     explicit ThreadPool(int size=0)
//     :_max_size(size)
//     ,_active_size(0)
//     ,_stop(false)
//     {
//         if(_max_size < 1){
//             //如果这里线程数量不足那么我们就默认最大线程数
//             //为CPU核心数
//             _max_size=thread::hardware_concurrency();
//         }
//         _workers.resize(_max_size);
//         for(int i=0;i<_max_size;i++)
//         {
//             //为每个线程都初始化好线程以后
//             pthread_t tid;
//             pthread_create(&tid,nullptr,ThreadFunction,this);
//             _workers.push_back(tid);
//         }
//     }
//     ~ThreadPool()
//     {
//         unique_lock<mutex> lock(_queue_mutex);
//         _stop=true;
//         _not_empty_cond.notify_all();
//         for(auto& iter:_workers)
//         {
//             if(pthread_join(iter,nullptr)!=0){
//                 cerr<<"Failed to join workers thread"<<endl;
//             }
//         }
//     }
// private:
//     static void* ThreadFunction(void* args)
//     {
//         ThreadPool* pool=static_cast<ThreadPool*>(args);
//         pool->workerEntry();
//         return nullptr;
//     }
//     void workerEntry()
//     {
//         while(!_stop)
//         {
//             function<void()> task;
//             {
//                 unique_lock<mutex> lock(_queue_mutex);
//                 _not_empty_cond.wait(lock,[this](){return !_task_queue.empty() && !_stop})
//             }
//         }
//     }
// private:
//     bool _stop;
//     int _max_size;
//     int _active_size;
//     queue<function<void>> _task_queue;
//     vector<pthread_t> _workers;
//     //保护任务队列的互斥锁
//     mutex _queue_mutex;
//     //非空条件变量
//     condition_variable _not_empty_cond;
// };